package facade;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.implementations.postgresql.CuentaUsuarioDB;
import dao.implementations.postgresql.UsuarioDB;
import dao.implementations.postgresql.Administrador.ProyectoDB;
import dao.interfaces.ICuentaUsuario;
import dao.interfaces.Administrador.IProyecto;
import dao.transferObjects.UsuarioTO;
import dao.transferObjects.UsuarioUnificadoTO;
import dao.transferObjects.Administrador.AdministradorTO;
import dao.transferObjects.Administrador.ProyectoTO;
import dao.transferObjects.Docente.DocenteTO;
import dao.transferObjects.Gae.AlumnoTO;
import dao.transferObjects.Gae.GaeTO;
import dao.transferObjects.Socio.DireccionTO;
import dao.transferObjects.Socio.SocioTO;

public class FacadeCuentaUsuario extends FacadeBase {

	public int crearUsuarioAdmin(AdministradorTO admin, UsuarioTO usuario)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());		
		UsuarioDB usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		resp = usuarioDB.registrarUsuario(usuario);
		
		if(resp > 0)
		{
			resp = cuentaUsuarioDB.crearUsuarioAdmin(admin);
			if(resp > 0){
				this.connection.commit();
			}
			else{
				this.connection.rollback();
				resp = -1;
			}
		}
		
		try{
			this.connection.getConnection().close();
		} 
		catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

	public int crearUsuarioDocente(DocenteTO docente, UsuarioTO usuario) {
		int resp = -1;
		
		this.connection.setAutoCommit(false);
		
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());		
		UsuarioDB usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		resp = usuarioDB.registrarUsuario(usuario);
		
		if(resp > 0)
		{
			resp = cuentaUsuarioDB.crearUsuarioDocente(docente);
			
			if(resp > 0){
				this.connection.commit();
			}
			else{
				this.connection.rollback();
				resp = -1;
			}
		}
		
		try	{
			this.connection.getConnection().close();
		}
		catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

	public int crearUsuarioSocio(SocioTO socio, UsuarioTO usuario, DireccionTO direccion) {
		int resp = -1;
		
		this.connection.setAutoCommit(false);
		
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());		
		UsuarioDB usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		resp = usuarioDB.registrarUsuario(usuario);
		
		if(resp > 0)
			resp = cuentaUsuarioDB.crearUsuarioSocio(socio);
		
		if(resp > 0)
			resp = cuentaUsuarioDB.crearDireccionSocio(socio, direccion);
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
		
		try	{
			this.connection.getConnection().close();
		}
		catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

	public int crearUsuarioGae(GaeTO gae, UsuarioTO usuario, List<AlumnoTO> array_alumnos) {
		return 0;
	}


	public int modificarUsuarioAdmin(AdministradorTO admin, UsuarioTO usuario) {
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());		
		UsuarioDB usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		resp = usuarioDB.modificarUsuario(usuario);
		
		if(resp > 0)
		{
			resp = cuentaUsuarioDB.modificarUsuarioAdmin(admin);
			if(resp > 0){
				this.connection.commit();
			}
			else{
				this.connection.rollback();
				resp = -1;
			}
		}
		
		try{
			this.connection.getConnection().close();
		} 
		catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

	public int modificarUsuarioDocente(DocenteTO docente, UsuarioTO usuario) {
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());		
		UsuarioDB usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		resp = usuarioDB.modificarUsuario(usuario);
		
		if(resp > 0)
		{
			resp = cuentaUsuarioDB.modificarUsuarioDocente(docente);
			if(resp > 0){
				this.connection.commit();
			}
			else{
				this.connection.rollback();
				resp = -1;
			}
		}
		
		try{
			this.connection.getConnection().close();
		} 
		catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

	public int modificarUsuarioSocio(SocioTO socio, UsuarioTO usuario, DireccionTO direccion) {
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());		
		UsuarioDB usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		resp = usuarioDB.modificarUsuario(usuario);
		
		if(resp > 0)
			resp = cuentaUsuarioDB.modificarUsuarioSocio(socio);
		if(resp > 0)
			resp = cuentaUsuarioDB.modificarDireccionSocio(socio, direccion);
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
		
		try{
			this.connection.getConnection().close();
		} 
		catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

	public int modificarUsuarioGae(GaeTO gae, UsuarioTO usuario) {
		return 0;
	}

	public int eliminarUsuarioAdmin(AdministradorTO admin, UsuarioTO usuario) {
		return 0;
	}

	public int eliminarUsuarioDocente(DocenteTO docente, UsuarioTO usuario) {
		return 0;
	}

	public int eliminarUsuarioSocio(SocioTO socio, UsuarioTO usuario) {
		return 0;
	}

	public int eliminarUsuarioGae(GaeTO gae, UsuarioTO usuario) {
		return 0;
	}
	
	public UsuarioUnificadoTO obtenerUsuarioAdmin(int rut){
		return null;
	}
	public UsuarioUnificadoTO obtenerUsuarioDocente(int rut){
		return null;
	}
	public UsuarioUnificadoTO obtenerUsuarioSocio(int rut){
		UsuarioUnificadoTO usuariosUnido = new UsuarioUnificadoTO();
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());
		
		usuariosUnido = cuentaUsuarioDB.obtenerUsuarioSocio(rut);
		
		this.closeConnection();		
		return usuariosUnido;
	}
	public GaeTO obtenerUsuarioGae(GaeTO gae){
		return null;
	}
	
	public List<AdministradorTO> obtenerTodosUsuarioAdmin(){
		return null;
	}
	public List<DocenteTO> obtenerTodosUsuarioDocente(){
		return null;
	}
	public List<UsuarioUnificadoTO> obtenerTodosUsuarioSocio(){
		List<UsuarioUnificadoTO> usuariosUnidos = null;
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());
		
		usuariosUnidos = cuentaUsuarioDB.obtenerTodosUsuarioSocio();
		
		this.closeConnection();	
		
		if(usuariosUnidos.size() == 0)
			return null;
		return usuariosUnidos;
	}
	public List<UsuarioUnificadoTO> obtenerUsuariosSocioConAsignacion(){
		List<UsuarioUnificadoTO> usuariosSocioReducido = new ArrayList<UsuarioUnificadoTO>();
		List<UsuarioUnificadoTO> todosUsuariosSocio = null;
		List<ProyectoTO> listaProyectosAsociados = null;
		
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		listaProyectosAsociados = proyectoDB.obtenerProyectosAsignados();
		todosUsuariosSocio = cuentaUsuarioDB.obtenerTodosUsuarioSocio();
		
		if(listaProyectosAsociados.size()>0 && todosUsuariosSocio.size()>0){
			for(int i=0;i<todosUsuariosSocio.size();i++){
				for(int j=0;j<listaProyectosAsociados.size();j++){
					if(todosUsuariosSocio.get(i).getUsuario().getRut() == listaProyectosAsociados.get(j).getRut_socio()){
						usuariosSocioReducido.add(todosUsuariosSocio.get(i));
						break;
					}
				}
			}
		}
		else{
			//usuariosSocioReducido = todosUsuariosSocio;
		}
		
		this.closeConnection();	
		
		if(usuariosSocioReducido.size() == 0)
			return null;
		
		return usuariosSocioReducido;
	}
	public List<GaeTO> obtenerTodosUsuarioGae(){
		return null;
	}
	
	public List<UsuarioUnificadoTO> obtenerTodosUsuarioUnidicadoTO()
	{
		List<UsuarioUnificadoTO> usuariosUnidos = new ArrayList<UsuarioUnificadoTO>();
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());
		
		usuariosUnidos = cuentaUsuarioDB.obtenerTodosUsuarioUnidicadoTO();
		
		this.closeConnection();		
		return usuariosUnidos;
	}
	
	public UsuarioUnificadoTO obtenerUsuarioLogeado(int rutUsuario, String tipoUsuario)
	{
		UsuarioUnificadoTO usuarioUnificado = new UsuarioUnificadoTO();
		ICuentaUsuario cuentaUsuarioDB = new CuentaUsuarioDB(this.connection.getConnection());
		
		usuarioUnificado = cuentaUsuarioDB.obtenerUsuarioLogeado(rutUsuario, tipoUsuario);
		
		this.closeConnection();		
		return usuarioUnificado;
	}

}
